﻿הגדרת נתונים התחלתיים
=================

בדיקות אוטומטיות בדרך כלל מתבצעות מספר רב של פעמים. בכדי לוודא שתהליך הבדיקה יכול לחזור על עצמו, אנו נרצה להריץ אתה הבדיקה במצב ידוע הנקרא *fixture*. לדוגמא, בכדי לבדוק את אפשרות פרסום הודעה באפליקצית בלוג, בכל פעם שאנו מריצים את הבדיקה, הטבלאות השומרות מידע הקשור להודעות (לדוגמא, טבלת ה `Post`, טבלת ה `Comment`) יש צורך בלשחזר את הטבלה למצב התחלתי כלשהו. הדוקומנטציה של  [PHPUnit ](http://www.phpunit.de/wiki/Documentation) מתארת באופן מעמיק לגבי התקנת טבלאות קבועות כללית. בחלק זה, אנו בעיקר נתאר כיצד להגדיר מידע קבוע עבור טבלאות, כפי שתארנו בדוגמא.

הגדרת טבלאות קבועות (fixture) הוא אחד החלקים שלוקחים הכי הרבה זמן להגדרה בעבור אפליקציה שמשתמשת במסד נתונים לצורך שמירת מידע.  Yii מספקת רכיב בשם [CDbFixtureManager] בכדי לפשט בעיה זו. רכיב זה מבצע את הפעולות בהבאות בעת הרצת סט של בדיקות:

* לפני שכל הבדיקות רצות, הרכיב מאפס את כל הטבלאות הרצויות למצב התחלתי וידוע.
* לפני הרצת מתודת בדיקה אחת, היא מאפסת את הטבלאות הרצויות למצב התחלתי וידוע.
* במהלך הרצת מתודת בדיקה, היא מאפשרת גישה לשורות הקשורות לאותה בדיקה.

בכדי להשתמש ב [CDbFixtureManager], אנו מגדירים אותו [קובץ הגדרות האפליקציה](/doc/guide/basics.application#application-configuration) בצורה הבאה,

~~~
[php]
return array(
    'components'=»array(
        'fixture'=»array(
            'class'=»'system.test.CDbFixtureManager',
        ),
    ),
);
~~~

לאחר מכן אנו מספקים את המידע אודות הטבלאות הקבועות תחת התיקיה `protected/tests/fixtures`. ניתן לשנות את התיקיה לתיקיה במיקום אחר על ידי הגדרת המאפיין [CDbFixtureManager::basePath] בהגדרות האפליקציה. המידע אודות הנתונים ההתחלתיים לטבלאות מסודר כאוסף של קבצי PHP הנקראים קבצי fixture. כל קובץ התחלתי לטבלאות מחזיר מערך המייצג את המידע ההתחלתי לטבלה מסויימת. שם הקובץ הוא זהה לשם הטבלה. להלן דוגמא למידע עבור הטבלה `Post` הנשמר בקובץ בשם `Post.php`:

~~~
[php]
«?php
return array(
    'sample1'=»array(
        'title'=»'test post 1',
        'content'=»'test post content 1',
        'createTime'=»1230952187,
        'authorId'=»1,
    ),
    'sample2'=»array(
        'title'=»'test post 2',
        'content'=»'test post content 2',
        'createTime'=»1230952287,
        'authorId'=»1,
    ),
);
~~~

כפי שניתן לראות, ישנם שני שורות של מידע המוחזרות בקוד המוצג למעלה. כל שורה מיוצגת כמערך שמפתחותיו הם שמות העמודות בטבלה והערכים של המפתחות הם הערכים השמורים בעמודות בטבלה. בנוסף, כל שורה מאונדקסת על ידי סטרינג (לדוגמא `sample1`, `sample2`) הנקראים *שמות מקוצרים לשורות*. אחר כך, כשאנו נכתוב סקריפטים לבדיקה, אנו יכולים להתייחס לכל שורה על ידי שמה המקוצר. אנו נסביר לגבי זה בהרחבה בחלק הבא.

כפי שניתן לראות אנו לא מגדירים את העמודה `id` בקוד למעלה. זה מכיוון שהעמודה `id` מוגדרת כמפתח ראשי שערכו יתמלא באופן אוטומטי בכל שורה חדשה שנוסיף.

ברגע שהרכיב [CDbFixtureManager] יקרא בפעם הראשונה, הוא יעבור על כל קבצי הטבלאות הקבועות ויאפס אותם למצב התחלתי. הוא מאפס טבלה על ידי ריקון הטבלה מתוכן, מאפס את המספר העולה של העמודה המכילה את המפתח הראשי בטבלה, ואז מוסיפה את הנתונים מקבצי הטבלאות הקבועים לטבלה.

לפעמים, אנו לא נרצה לאפס כל טבלה המכילה מצב התחלתי כלשהו לפני שאנו מריצים בדיקות, בגלל שאיפוס כמה טבלאות קבועות יכול לקחת הרבה זמן. במקרה זה, אנו יכולים לכתוב סקריפט PHP בכדי לבצע את העבודה ההתחלתית בצורה מותאמת אישית. הסקריפט צריך להשמר בקובץ בשם `init.php` תחת התיקיה המכילה את קבצי הטבלאות הקבועות. ברגע שהרכיב [CDbFixtureManager] יזהה את הקיום של קובץ זה, הוא יריץ את הקובץ הזה במקום לאפס כל טבלה.

אפשרות נוספת היא שאנו לא נרצה להשתמש בדרך ברירת המחדל של איפוס טבלה, כלומר, איפוס הטבלה והוספת הנתונים הקבועים לתוכה. למקרה זה, אנו יכולים לכתוב סקריפט התחלתי ספציפית לקובץ 'מידע התחלתי לטבלה' מסויים. הסקריפט צריך להשמר בקובץ PHP תחת שם הטבלה ולאחריו `.init.php`. לדוגמא, הקובץ ההתחלתי עבור הטבלה `Post` יהיה `Post.init.php`. ברגע שהרכיב [CDbFixtureManager] יזהה שסקריפט זה קיים, הוא יריץ את הסקריפט הזה במקום להריץ את הסקריפט אשר מאפס את הטבלה בצורה הרגילה.

» Tip|טיפ: במידה ויהיו הרבה קבצי 'מידע התחלתי לטבלה' כלומר הרבה קבצים של מצב התחלתי עבור טבלאות, זה יכול לעלות את משך זמן הבדיקה בצורה משמעותית. מסיבה זו, עליך להגדיר קבצי 'מידע התחלתי לטבלה' עבור טבלאות שהתוכן שלהם משתנה בלבד במהלך הבדיקה. טבלאות אשר משמשות עבור קישורים בין טבלה אחת לשנייה תוכנם לא משתנה לכן אין צורך בליצור עבורם קבצי 'מידע התחלתי לטבלה'.

בשני החלקים הבאים, אנו נתאר כיצד להשתמש במצבים ההתחלתיים המנוהלים על ידי [CDbFixtureManager] בבדיקות יחידה ובדיקות פונקציונליות.

«div class="revision"»$Id: test.fixture.txt 1148 2009-06-18 22:06:22Z qiang.xue $«/div»